package main

import "fmt"

/*
指针操作
	& 取地址符-->获取对象的内存地址
	* 解引用符-->返回对应类型的指针
*/

func main() {
	num := 2
	p := &num    // 取出num的内存地址
	rawNum := *p // 通过内存地址访问元素
	fmt.Println(num, "num的内存地址>>", p)
	fmt.Println(rawNum)
	*p = 20
	fmt.Println("*p = 20 通过指针修改后的num值>", num)
	// 声明指针-->声明指针后还得初始化，为其分配内存，否则就是空指针，无法正常使用
	// 要么使用取地址符将其他变量的地址赋值给该指针，要么就使用内置函数new手动分配
	// 例如：
	var numPtr *int
	numPtr = &num // 通过取地址符将其他变量的地址赋值给新指针
	fmt.Println("新建指针numPtr的内存地址>>", numPtr)

	numPtr2 := new(int) // 内置函数new手动分配--可省略初始化步骤
	fmt.Println("numPtr2的内存地址>", numPtr2)

	var numPtr3 *int   // 初始化指针
	numPtr3 = new(int) // 手动分配内存
	fmt.Println("numPtr3的内存地址>", numPtr3)
	fmt.Println("numPtr3的值>", *numPtr3)

}
